package cc.flyflow.core.listeners.event_listener_impl;

import cc.flyflow.core.listeners.EventListenerStrategy;
import cc.flyflow.core.utils.FlowableUtils;
import lombok.extern.slf4j.Slf4j;
import org.flowable.common.engine.api.delegate.event.FlowableEngineEventType;
import org.flowable.common.engine.api.delegate.event.FlowableEvent;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.event.impl.FlowableActivityEventImpl;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

/**
 * 在Flowable中，以下是各个概念的含义和关系：
 *
 * ### Entity
 * - **定义**: `Entity`是Flowable中持久化对象的抽象表示，通常对应数据库中的一张表。
 * - **用途**: 用于存储流程引擎的各种数据，如流程定义、流程实例、任务等。
 *
 * ### Job
 * - **定义**: `Job`表示需要异步执行的任务，如定时任务、延迟任务等。
 * - **用途**: 用于处理需要在后台执行的操作，确保流程的异步执行。
 *
 * ### Task
 * - **定义**: `Task`表示流程中的一个待办任务，可以是用户任务、服务任务等。
 * - **用途**: 用于分配和管理流程中的具体工作项。
 *
 * ### Process
 * - **定义**: `Process`表示一个完整的业务流程实例，由多个`Activity`组成。
 * - **用途**: 用于定义和管理整个业务流程的生命周期。
 *
 * ### Activity
 * - **定义**: `Activity`表示流程中的一个具体步骤或任务，如用户任务、服务任务等。
 * - **用途**: 用于定义和执行流程中的具体操作步骤。
 *
 * ### Variable
 * - **定义**: `Variable`表示流程实例中的变量，用于存储和传递流程中的数据。
 * - **用途**: 用于在流程执行过程中存储和共享数据。
 *
 * ### Historic
 * - **定义**: `Historic`表示流程执行的历史数据，包括流程实例、任务、变量等的历史记录。
 * - **用途**: 用于审计和分析流程执行的历史信息。
 *
 * ### Stage
 * - **定义**: `Stage`表示流程中的一个阶段，通常用于分组和管理流程中的多个`Activity`。
 * - **用途**: 用于将流程划分为多个阶段，便于管理和控制。
 *
 * ### 关系
 * - `Process`由多个`Activity`组成。
 * - `Activity`可以是具体的`Task`（如用户任务、服务任务）。
 * - `Task`和`Activity`可以使用`Variable`来存储和传递数据。
 * - `Job`用于处理异步任务，确保流程的异步执行。
 * - `Entity`是持久化对象的抽象表示，存储在数据库中。
 * - `Historic`用于存储流程执行的历史数据。
 * - `Stage`用于将流程划分为多个阶段，便于管理。
 * 实例节点开始了
 *Activity
 * 定义: Activity表示流程中的一个具体步骤或任务。它可以是用户任务、服务任务、脚本任务等。
 * 事件: Flowable中有许多与activity相关的事件，如ACTIVITY_STARTED、ACTIVITY_COMPLETED、ACTIVITY_CANCELLED等。这些事件用于跟踪和���理流程中每个活动的状态变化。
 * 用途: Activity用于定义和执行流程中的具体操作步骤。activity表示流程中的具体任务，如userTask和serviceTask。
 * Process
 * 定义: Process表示一个完整的业务流程实例。它由多个activity组成，定义了从开始到结束的整个流程。
 * 事件: Flowable中也有许多与process相关的事件，如PROCESS_STARTED、PROCESS_COMPLETED、PROCESS_CANCELLED等。这些事件用于跟踪和管理整个流程实例的状态变化。
 * 用途: Process用于定义和管理整个业务流程的生命周期。
 * @author Huijun Zhao
 * @description
 * @date 2023-10-10 10:12
 */
@Slf4j
@Component
public class ActivityStartedEventListener implements EventListenerStrategy, InitializingBean {
    /**
     * 处理数据
     *
     * @param event
     * @return
     */
    @Override
    public void handle(FlowableEvent event) {
        //节点开始执行
        FlowableActivityEventImpl flowableActivityEvent = (FlowableActivityEventImpl) event;
        String activityId = flowableActivityEvent.getActivityId();
        String activityName = flowableActivityEvent.getActivityName();
        DelegateExecution execution = flowableActivityEvent.getExecution();
        String tenantId = execution.getTenantId();

        String executionId = flowableActivityEvent.getExecutionId();
        log.info("节点开始  节点id：{} 名字:{} executionId:{}", activityId, activityName, executionId);


        String processInstanceId = flowableActivityEvent.getProcessInstanceId();

        String processDefinitionId = flowableActivityEvent.getProcessDefinitionId();
        String flowId = FlowableUtils.getFlowId(processDefinitionId, tenantId);

        DelegateExecution parent = execution.getParent();
        if (parent != null && parent.isMultiInstanceRoot()) {
            log.debug("有没有走到这里的");  //上级是多实例
        } else {
            saveStartEventContent(flowId, processInstanceId, activityId, activityName, execution.getId(), tenantId,execution.getParentId());
        }


    }

    @Override
    public void afterPropertiesSet() throws Exception {
        afterPropertiesSet(FlowableEngineEventType.ACTIVITY_STARTED.toString());

    }
}
